<template>
  <div class="search">
    <van-nav-bar
      title="搜索中心"
      left-arrow
      @click-left="$router.back()"
    ></van-nav-bar>
    <!-- ⭐⭐$router.back() 用于回退 -->
    <!-- 搜索框 -->
    <van-search
      v-model.trim="keyword"
      show-action
      shape="round"
      placeholder="请输入搜索关键词"
      @input="inputFn"
      @search="onSearch(keyword)"
    >
      <!-- ⭐⭐@search 事件 在移动端是点击搜索按钮 pc是回车触发 -->
      <template #action>
        <div @click="onSearch(keyword)">搜索</div>
      </template>
    </van-search>

    <!-- 推荐 -->
    <van-cell-group v-if="keyword">
      <van-cell
        @click="onSearch(item)"
        v-for="item in sugList"
        :key="item"
        icon="search"
      >
        <span v-html="heighLight(item, keyword)"></span>
      </van-cell>
    </van-cell-group>

    <!-- 历史记录 -->
    <van-cell-group v-else>
      <van-cell title="历史记录"></van-cell>
      <!-- ⭐⭐给搜索历史注册搜索事件 -->
      <van-cell
        @click="onSearch(item)"
        v-for="item in history"
        :key="item"
        :title="item"
      >
        <van-icon @click.stop="del(item)" name="close" />
      </van-cell>
    </van-cell-group>
    <!-- ⭐提示的空状态 搜索且无结果的响应数据的时候 -->
    <!-- 无响应结果的时候把数组设为空 -->
    <!-- <van-empty
      v-show="keyword && sugList.length === 0"
      class="custom-image"
      image="https://img01.yzcdn.cn/vant/custom-empty-image.png"
      description="暂无结果"
    /> -->
  </div>
</template>

<script>
import { getSuggest } from '@/api/search'
import { setSearchHistory, getSearchHistory } from '@/utils/storage'
export default {
  name: 'Search',
  data() {
    return {
      keyword: '', // 输入框内容
      sugList: [], // 存放推荐内容的数组
      history: getSearchHistory()
    }
  },
  methods: {
    // ⭐⭐搜索框内容与搜索结果匹配高亮显示
    heighLight(str, keyword) {
      const reg = new RegExp(keyword, 'gi')
      return str.replace(reg, (item) => {
        return `<span style="color:red">${item}</span>`
      })
    },
    inputFn() {
      // ⭐⭐使用防抖优化输入时频繁触发的效果
      clearTimeout(this.timeId)
      // ⭐通过this把延时器id属性及值 添加到vue组件对象上 清除时也this.timeId清除 不需要双向绑定无需在data里定义
      this.timeId = setTimeout(async () => {
        // 解决输入框变为空时发送请求报错 下拉列表无内容
        if (!this.keyword) return (this.sugList = [])
        const res = await getSuggest(this.keyword)
        console.log(res)
        // ⭐⭐后端没有响应数据数组为空的情况报错处理
        if (res.data.options[0] === null) {
          return (this.sugList = [])
        }
        this.sugList = res.data.options
      }, 300)
    },
    onSearch(val) {
      // ⭐搜索内容为空时报错
      if (!val) {
        return this.$toast('请输入内容')
      }
      console.log('搜索中...', val)
      // ⭐⭐搜索历史记录
      // 1.最新的在最前面 unshift
      // 2.数组里面不能有重复,先删再添
      // 先删
      this.history = this.history.filter((item) => item !== val)
      // 再添加
      this.history.unshift(val)
      // 存储到本地
      setSearchHistory(this.history)
      // 跳转页面
      this.$router.push({
        path: '/search/result',
        query: {
          // query 传参
          keyword: val
        }
      })
    },
    del(val) {
      // 删除历史记录
      this.history = this.history.filter((item) => item !== val)
      // 存储到本地
      setSearchHistory(this.history)
    }
  }
}
</script>

<style></style>
